
\chapter{Logiciel serveur}



	\section{Généralités}

		Le logiciel serveur a pour rôle de servir de relai entre les téléphones. Il est programmé en java
		et n'utilise rien de particulier.

		Pour l'instant le logiciel serveur ne dispose {\bf d'aucune base de données}, cela signifie qu'il
		se contente d'afficher des informations sur ce qui se passe mais qu'il n'effectue aucun contrôle
		avant de faire suivre les messages d'un téléphone à un autre.

		Comme nous avons choisi d'identifier les téléphones grâce à leurs numéros (de téléphone), dans la suite
		du document si nous parlons de l'identifiant d'un client, il s'agira de son numéro de téléphone.

	Les fonctions et classes sont documentées en javadoc, nous n'allons donc pas reprendre
	ici chaque méthode pour expliquer le fonctionnement mais reprendre l'architecture globale
	du projet.

	\section{Présentation des packages et fichiers}

		Le serveur est assez simple et est donc regroupé dans un seul package qui contient les fichiers suivant :

			\begin{description}

				\item[Launcher :]	La classe qui lance le programme (le main), elle se contente d'instancier un \verb+Server+.

				\item[Server :]		La classe serveur, elle attend des connexions des clients et les garde en mémoire (chaque
								connexion est associée à son identifiant, c'est à dire son numéro de téléphone). {\bf C'est
								dans cette classe que l'on peut définir le port sur lequel on attend les connexions}.

				\item[ClientThread :] Pour chaque client connecté on instancie un \verb+ClientThread+. Ce \verb+thread+ gère la connexion
								avec le client, c'est à dire qu'il peut recevoir et envoyer des messages au téléphone qui est
								connecté.

				\item[Commande :]	Cette classe sert à simplifier l'administration du serveur en ajoutant la possibilité d'entrer des
								commandes dans la console. Pour l'instant les commandes sont :
								\begin{description}
									\item[ls :]		Affiche la liste des clients connectés
									\item[quit :]	Quitte le serveur en fermant toutes les connexions
								\end{description}


			\end{description}




	\section{Protocole de communication réseau}

		La communication réseau entre le client et le serveur {\bf et} entre le serveur et le client s'effectue toujours de la même façon :
		une chaine (\verb+String+) est envoyée en premier, le premier caractère correspond au type de requête effectué (nous allons les
		détailler par la suite).


		\subsection{Réception de messages des clients}

			Pour avoir un aperçu des messages que peuvent envoyer les clients (et donc recevoir le serveur).
			Voir le fichier \verb+MessageType+ du package \verb+fr.utbm.tx52.reception+ du logiciel client.

			Au niveau du serveur, les messages sont reçus dans la méthode \verb+run+ de la classe \verb+ClientThread+. En regardant le contenu
			du fichier cité ci-dessus on retrouve les différentes requêtes possibles :

			\begin{lstlisting}[language=c++]
public enum MessageType {
	IDENTIFICATION	("#"),
	ASK_FOR_FRIEND	("+"),
	REMOVE_FRIEND	("-"),
	SHARE_PHOTO	("@"),
	COMMENT		("%"),
	FILE_IMAGE	("p"),
	FILE_SOUND	("s");
}
			\end{lstlisting}

			{\it Note :} pour une implémentation haut niveau, il suffit de traiter la chaine reçue dans \verb+run+ puis d'appeler une autre méthode
						de \verb+ClientThread+. Pour chacune des actions suivantes, je préciserai la méthode où est implémentée le travail du
						coté serveur.

			\subsubsection{Message d'identification}

				Le client s'identifie sur le serveur. Par exemple :

				\begin{lstlisting}[style=terminal]
# 0611111111
				\end{lstlisting}

				Le téléphone qui a pour identifiant 0611111111 se connecte au serveur.

				{\it Méthode :} \verb+connexion(String id)+.

			\subsubsection{Demande d'amitié}

				Le client courant demande pour devenir ami avec un autre client. Par exemple :

				\begin{lstlisting}[style=terminal]
+ 0622222222
				\end{lstlisting}

				Le téléphone courant demande à devenir ami avec le téléphone qui a pour identifiant 0622222222.

				{\it Méthode :} \verb+addFriend(String id)+.
				Actuellement le serveur fait suivre l'invitation au client concerné (ici 0622222222).


			\subsubsection{Suppression d'amitié}

				Le client courant demande de supprimer son amitié avec un autre client. Par exemple :

				\begin{lstlisting}[style=terminal]
- 0622222222
				\end{lstlisting}

				Le téléphone courant demande à supprimer son amitié avec le téléphone qui a pour identifiant 0622222222.

				{\it Méthode :} \verb+deleteFriend(String id)+.



			\subsubsection{Tranfert d'un fichier}

				Pour le tranfert de fichier, on doit faire face à deux cas de figure :
				\begin{enumerate}
					\item Les fichier image, leur symbole est \og{}p\fg{} comme picture.
					\item Les fichier son, leur symbole est \og{}s\fg{} comme sound.
				\end{enumerate}

				{\it Dans l'exemple suivant nous travaillons avec un fichier image, mais la démarche est la même pour un fichier
					d'un autre type.}

				Réception d'un fichier image que l'on va partager avec quelqu'un (on ne sait pas encore qui). Par exemple :

				\begin{lstlisting}[style=terminal]
p
				\end{lstlisting}

				Le téléphone courant annonce le transfert d'une image. Tout de suite après, on sait que l'on va recevoir un tableau
				de bits par la socket qui correspond au contenu du fichier image. On va donc enregistrer ce tableau de bits dans
				un fichier du coté serveur\footnote{La suppression des fichiers inutiles coté serveur n'est pas encore faite car
				elle nécessite la mise en place d'une base de données}. Chaque fichier prend le nom suivant \verb+identifiant_dateComplete.jpg+
				(si c'est une image, ou .gp3 si c'est un son)
				où date complète correspond à la date courante au format \verb+yyyy-MM-dd-HH.mm.ss+, ce format est défini dans
				\verb+ClientThread+, attribut (\verb+timeStampFormat+).

				{\it Méthode :} \verb+receiveFile(FileType f)+. Pour
				\verb+FileType+, voir l'énumération définie dans \verb+ClientThread+.



			\subsubsection{Ajout d'un commentaire sur l'image en cours}

				Le client courant demande d'ajouter un commentaire à la photo qu'il vient d'envoyer. Par exemple :

				\begin{lstlisting}[style=terminal]
% Voici mon super commentaire !
				\end{lstlisting}

				Le téléphone courant demande à ajouter comme commentaire écrit : \og{}Voici mon super commentaire !\fg{} à
				l'image en cours de partage.

				{\it Méthode :} \verb+setComment(String comment)+.



			\subsubsection{Validation du partage d'une image}


				Le client courant valide le partage des dernières données envoyées. Par exemple :

				\begin{lstlisting}[style=terminal]
@ 0611111111 0622222222
				\end{lstlisting}

				Le téléphone courant demande à partager la dernière image qu'il a envoyé, le dernier son qu'il a envoyé et le
				dernier commentaire qu'il a envoyé avec les téléphones 0611111111 et 0622222222. Les données image, son et
				commentaire sont alors réinitialisées pour le prochain envoi.

				{\it Méthode :} \verb+share(List<String> ids)+. Le serveur fait actuellement suivre les fichiers aux téléphones
						concernés par le partage sans vérifier l'amitié (cela nécessiterait une base de données).


		\subsection{Envoi de message}

			Le serveur a également la possibilité d'envoyer des messages aux clients.

			\subsubsection{Message simple}

				Tout comme les messages que le serveur reçoit, le protocole consiste à envoyer une chaîne qui concerne
				le type de message.

				Les envois de messages à un client se font via \verb+sendMessage(String type, String content)+ de
				\verb+ClientThread+. Le type devrait être passé selon une énumération (comme celle que l'on a vu
				ci-dessus mais comme la base de donnée n'est pas en place, le serveur n'envoie que très peut
				d'instruction donc ce n'est pas encore en place.

			\subsubsection{Média}

				Ce que l'on appel média c'est
				\begin{enumerate}
					\item une image
					\item un son (en option)
					\item un commentaire textuel associé à l'image
				\end{enumerate}

				On notera l'utilisation de \verb+sendFile(String path)+ dans \verb+ClientThread+ qui permet d'envoyer
				un fichier au client mais on ne l'appel à priori pas explicitement, c'est la méthode :
				\verb+void sendMedia(String id, String from, String photo, String sound, String comment)+
				qui se situe dans \verb+Server+ qui s'en charge.

				Le message a la structure suivante :

				\begin{lstlisting}[style=terminal]
@ 0611111111 image.jpg son.gp3 Et le commentaire arrive ensuite
				\end{lstlisting}

				Cela signifie que le client va recevoir un message de 0611111111 donc l'image devra être enregistrée
				dans image.jpg et le son dans son.gp3 (s'il n'y a pas de son ce paramètre vaut \og{}null\fg{}.
				Le commentaire occupe le reste des arguments.



